<?php
 
require_once('utils/csv.inc.php');
require_once('utils/ftp.inc.php');
require_once('dao/CommandeDao.php');
require_once('dao/CarteSimDao.php');
require_once('dao/ClientDao.php');
require_once('dao/OffreVenteDao.php');

/**
 * Classe de création de fichier CSV de demande d'activation.
 */
 class AccountStatus {
	 
	/**
	 * Vérification du dernier fichier de compte.
	 */
	public static function checkStatus(){

            global $logger;
		$logger->info("Vérification de la présence d'un fichier AccountStatus");
		
		// Téléchargement du dernier fichier AccountStatus disponible
		$csvFile = downloadFile(MM_CSV_PATH, MM_FTP_ACCOUNT_STATUS, MM_FTP_HOST, MM_FTP_USERNAME, MM_FTP_PASSWORD,false);// true : supprime le fichier en FTP après téléchargement

                // Si pas de nouveaux fichier on arrête le traitement
		if (empty($csvFile)){
			$logger->error = "Pas de Fichier CSV ou vide";
			return;
		}
		
		// Lecture et analyse du fichier CSV reçu
		$data = readCSV($csvFile);
		
		$count = 0;
		$commande_id = '';
		// Pour chaque ligne de données
		foreach($data as $row){
			
			// La première ligne constitue l'entête des colonnes CVS
			if ($count == 0)
			{
				
				//var_dump($row);
				$header = $row;
				//echo count($header);
				//var_dump($header);
//				if (count($header) != 48) //31 ou 49
//				{
//					$logger->error('Le fichier CSV récupéré ne contient pas 51 colonnes : ' . count($header));
//					throw new Exception("Le nombre de colonnes trouvées dans le fichier CSV est incorrect");
//				}
				
			// Les autres lignes constitues le statut des lignes téléphoniques
			} 
			else 
			{
				$n = 0;
				$line = array();
				// Constitution d'une Map pour éviter les erreurs de traitement sur base du header transmis dans le fichier CSV.
				foreach($row as $field)
				{
					$line[$header[$n]] = $field;
					$n++;
					
				}
//				var_dump($line);die;
				$commande_id = AccountStatus::updateStatus($line);	
			}
			$count++;	
		
		}
		//Passer la commande à traitée
		//if($commande_id){CommandeDao::changerStatut($commande_id, "traitée");}
	}
	
//mise en timestamp de la date d'activation
private static function Date_Format($data)
{
	$tab_date = array();
	
	//remplace les - par /
	$date = str_replace('-', '/', $data);
	//sépare les éléments suivant l'ordre aaaa/mm/jj ou jj/mm/aaaa
	if(strpos($date, '/')===4)
	{
		list($annee, $mois, $jour) = explode("/",$date);
	}else{
		list($jour, $mois, $annee) = explode("/",$date);
	}
	$tab_date['date_formatee'] = $jour.'/'.$mois.'/'.$annee;
	$tab_date['jour'] = $jour;
	$tab_date['mois'] = $mois;
	$tab_date['annee'] = $annee;
	
	return $tab_date;
}
	/**
	 * Méthode de mise à jour du statut d'une ligne téléphonique.
	 * 
	 * @param unknown $line Ligne de données transmis par le service Account Status.
	 */
	private static function updateStatus($line){
		
		global $logger;

		// On recherche l'abonné par son numéro de SIM
		$lineCommande = CommandeDao::findLigneBySIM($line["SIMSerial"]);

		// Si l'abonné est inexistant 
		if ($lineCommande == null)
		{
			$logger->error("Aucune ligne de commande trouvée pour la sim suivante : ".$line["SIMSerial"]);
			return;
		}

		// Récupération de la commande
		$commande = CommandeDao::findByCommandeId($lineCommande["id_commande"]);
		$logger->info("La ligne est associée à la commande : " . $commande['id']);
		 		
			//changement du format de la date si besoin en tableau de données
			if($line["LineStatusDate"])
			{
				$LineStatusDate = AccountStatus::Date_Format($line["LineStatusDate"]);
				$line["LineStatusDate"] = $LineStatusDate['date_formatee'];
			}
			
			if($line["ForeignStatusDate"])
			{
				$ForeignStatusDate = AccountStatus::Date_Format($line["ForeignStatusDate"]);
				$line["ForeignStatusDate"] = $ForeignStatusDate['date_formatee'];
			}
			
			if($line["PortingStatusDate"])
			{
				$PortingStatusDate = AccountStatus::Date_Format($line["PortingStatusDate"]);
				$line["PortingStatusDate"] = $PortingStatusDate['date_formatee'];
			}
			
			if($line["SMSStatusDate"])
			{
				$SMSStatusDate = AccountStatus::Date_Format($line["SMSStatusDate"]);
				$line["SMSStatusDate"] = $SMSStatusDate['date_formatee'];
			}
			
			if($line["OtherStatusDate"])
			{
				$OtherStatusDate = AccountStatus::Date_Format($line["OtherStatusDate"]);
				$line["OtherStatusDate"] = $OtherStatusDate['date_formatee'];
			}
			
			if($line["DATAStatusDate"])
			{
				$DATAStatusDate = AccountStatus::Date_Format($line["DATAStatusDate"]);
				$line["DATAStatusDate"] = $DATAStatusDate['date_formatee'];
			}
			
			if($line["BlackberryStatusDate"])
			{
				$BlackberryStatusDate = AccountStatus::Date_Format($line["BlackberryStatusDate"]);
				$line["BlackberryStatusDate"] = $BlackberryStatusDate['date_formatee'];
			}
			
		if(isset ($line["ActivationDate"]) and $line["ActivationDate"] <> '')
		{
			$ActivationDate = AccountStatus::Date_Format($line["ActivationDate"]);
			$line["ActivationDate"] = $ActivationDate['date_formatee'];
			
			$str_ActivationDate= $ActivationDate['annee'].$ActivationDate['mois'].$ActivationDate['jour'];
			$activationdate=mktime(0,0,0,$ActivationDate['mois'],$ActivationDate['jour'],$ActivationDate['annee']);
		}else{
			$activationdate=0;
		}
		
	//si la sim est résiliée
	if($line["LineStatus"] == 'Terminated')
	{
		$logger->info("Changement du statut de la carte SIM (Terminated) : " . $lineCommande['carte_sim']);
		CarteSimDAO::changerStatut($lineCommande['carte_sim'], "Terminated");
		$logger->info("Changement du statut de la ligne (Terminated) : " . $line["Msisdn"]);
		$statut = 'Terminated';
		ClientDao::ChangeLineStatus($line["Msisdn"],$statut);
	}else{
		
		//si la ligne a été activée
		//if ($activationdate != '' and $activationdate <= time() and $line["SIMSerial"] == $lineCommande['carte_sim'] and $commande['date_traitement'] == '0000-00-00 00:00:00' )
		if ($activationdate != '' and $activationdate <= time() and $line["SIMSerial"] == $lineCommande['carte_sim'] and $lineCommande['activation_date'] == ''  )
		{ 
			
			// Mise à jour de la ligne de commande en base
			CommandeDao::updateLineStatus(
			$lineCommande['id'],
			$line["SubscriberNumber"],
			$line["SIMSerial"],
			$line["LastName"],
			$line["FirstName"],
			$line["ZipCode"],
			$line["RatePlan"],
			$line["ActivationDate"],
			$line["Msisdn"],
			$line["RIO"],
			$line["LineStatus"],
			$line["LineStatusDate"],
			$line["PortingType"],
			$line["PortingDate"],
			$line["PortingStatus"],
			$line["PortingStatusDate"],
			$line["PortingStatusInfos"],
			$line["DATAStatus"],
			$line["DATAStatusDate"],
			$line["BlackberryStatus"],
			$line["BlackberryStatusDate"],
			$line["ForeignStatus"],
			$line["ForeignStatusDate"],
			$line["VoiceStatus"],
			$line["forfait_jours"],
			$line["forfait_horaires"],
			$line["SMSStatus"],
			$line["SMSStatusDate"],
			$line["OtherStatus"],
			$line["OtherStatusDate"],
			//$line["subvention"],
			$line["mobile"],
			$ligne["offre_de_vente"],
			$line["pv_offre_HT"],
			$line["option_sms"],
			$line["pv_sms_HT"],
			$line["option_data"],
			$line["pv_data_HT"],
			$line["option_bb"],
			$line["pv_bb_HT"],
			$line["option_international"],
			$line["pv_international_HT"],
			$line["reduc_abo"],
			$line["reduc_minute_national"],
			$line["reduc_minute_international"],
			$line["reduc_option_mobile"],
			$line["reduc_terminal"],
			$line["grille_tarifaire"],
			$line["forfait_partage"],
			$line["engagement"],
			$line["interne"],
			$ligne["grille_ory"]
			);
			
			// Consommation de la SIM
			$carte_sim = CarteSimDAO::findByNumeroSim($lineCommande['carte_sim']);
			if ($carte_sim['hlrstatus'] != "Allocated"){
				$logger->error("Activation d'une ligne n'ayant pas le statut 'Allocated'");
			}
			$logger->info("Changement du statut de la carte SIM : " . $lineCommande['carte_sim']);
			CarteSimDAO::changerStatut($lineCommande['carte_sim'], "Active");
			
			// Association SIM -> MSISDN
			$logger->info("Association de la carte SIM au MSISDN : " . $line["Msisdn"]);
			CarteSimDAO::changerMsisdn($lineCommande['carte_sim'], $line["Msisdn"]);
			
			// Récupération de la liste des options mobiles vendues
			$optionsMobileVE = CommandeDao::getOptionsVEFromLigneCommande($lineCommande['id']);
			
			// Vérification que tous les éléments de la commande soient identique aux éléments retournés.
			$offreMobileVE = OffreVenteDao::searchById($lineCommande['offre']);
			
			// Calcul fin engagement
			$fin_engagement = date("d/m/Y",strtotime($str_ActivationDate." + ".$lineCommande["engagement"]." months"));
			
			// Mise en forme de la date de la commande
			$commande_date = $lineCommande["date_souhaite"]." 00:00:00";
			
			//infos de l'équipement selectionné
			$terminal = CommandeDao::Terminal($lineCommande["terminal_mobile"]);
				
			// Mise à jour du detail client 
			$logger->info("Mise à jour du détail du client pour la facturation");
			ClientDao::ajouterLigneMobile($commande['code_client_hto'],$line["Msisdn"],$offreMobileVE[0]['nom'],$lineCommande["prix"],$commande_date,$terminal['libelle'],$lineCommande["terminal_prix"],$line["SIMSerial"],$line["RIO"],$carte_sim['puk'],$lineCommande["engagement"],$line["ActivationDate"],$fin_engagement,$lineCommande['utilisateur'],$optionsMobileVE,$offreMobileVE[0]['temps'],$offreMobileVE[0]['sms'],$offreMobileVE[0]['data'],$offreMobileVE[0]['jours'],$offreMobileVE[0]['horaires'],$line["VoiceStatus"],$line["SMSStatus"],$line["DATAStatus"],$line["BlackberryStatus"],$line["ForeignStatus"],$lineCommande["abonnement"],$lineCommande["minute_national"],$lineCommande["minute_international"],$lineCommande["mobil"],$lineCommande["option_mobile"],$lineCommande["grille_tarifaire"]);
			
			// Passer la commande à traitée
			if ($commande['statut'] == "envoyée")
			{
			CommandeDao::changerStatut($lineCommande['id_commande'], "traitée");
			}
			
			return $lineCommande['id_commande'];
		}
	}
			
	} 
}
			
			
// Rendu de la page
echo $twig->render('AccountStatus.html', 
		array(	'logger' => $logger,
				'message' => $message, 
				'error' => $error));